package com.shg.admin.controller;

import com.shg.admin.bean.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
@Slf4j
public class IndexController {

    private final JdbcTemplate jdbcTemplate;
    private final StringRedisTemplate stringRedisTemplate;

    public IndexController(JdbcTemplate jdbcTemplate, StringRedisTemplate stringRedisTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @GetMapping(value = "/sql")
    @ResponseBody
    public String count(){
        Long aLong = jdbcTemplate.queryForObject("select count(*) from t_user", Long.class);
        return aLong.toString();
    }

    /**
     * 用户首次访问我们的网站时,需要访问我们的登录页,这个Controller方法就是为了把我们网站的登录页呈现给用户
     *
     * @return 登录页面名称
     */
    @GetMapping(value = {"/", "/login"})
    public String toLoginPage() {
        return "login";
    }

    // 在登录页执行登录

    /**
     * 当用户看到了我们的登录页后,在登录页面输入用户名和密码,然后点击登录后调用此方法执行登录动作,这里要注意如下几个地方:
     * (1) 执行登录是使用post请求方式;
     * (2) 如果登录成功,则重定向 /main.html 这个请求(注意这是一个Controller的请求地址,而不是直接去页面的意思),此处采用重定向的原因是为了
     *     防止登录页面表单重复提交(因为重定向之后浏览器地址栏的地址会变成重定向之后的地址,在我们这个场景中,重定向之后浏览器地址就变成了页面
     *     main.html了,此时如果用户刷新页面,其刷新的只是重新请求 /main.html 这个路径,而不是重复提交登录请求)
     * (3) 如果登录失败,则跳转到登录页面,即login.html并携带提示信息
     * @param user
     * @param httpSession
     * @param model
     * @return
     */
    @PostMapping(value = "/login")
    public String main(User user, HttpSession httpSession, Model model) {
        if (StringUtils.hasText(user.getName()) && "123456".equals(user.getPassword())) {
            httpSession.setAttribute("loginUser", user);
            // 登录成功后重定向到管理系统主页(即请求 /main.html 这个Controller方法),此处采用重定向是为了防止登录表单重复提交
            return "redirect:/main.html";
        } else {
            model.addAttribute("msg", "账号或密码错误");
            // 回到登录页面
            return "login";
        }
    }

    @GetMapping(value = "/main.html")
    public String mainPage(HttpSession httpSession, Model model) {
        
        log.info("当前执行的方法是:{}","mainPage");
        // 进入后台管理页面时需要判断用户是否登录
        // Object loginUser = httpSession.getAttribute("loginUser");
        // if (!Objects.isNull(loginUser)) {
        //     return "main";
        // } else {
        //     model.addAttribute("msg", "请重新登录");
        //     return "login";
        // }

        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String mainPvCount = ops.get("/main.html");
        String sqlPvCount = ops.get("/sql");
        model.addAttribute("mainPvCount", mainPvCount);
        model.addAttribute("sqlPvCount", sqlPvCount);

        return "main";
    }
}
